package com.lang.functionallInterface;

import org.junit.Test;

import java.util.*;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

/**
 * @ClassName :FunctionallInterface
 * @Description 只有一个抽象方法的接口称为函数式接口，lambda是函数式接口的实现类
 * @Author away
 * @Date 2019/7/28
 */
public class FunctionalInterfaceDemo {


    /**
     * 消耗型接口
     * 遍历字符串
     */
    @Test
    public void testConsumer() {
        List<String> list = new ArrayList<>();
        list.add("test01");
        list.add("test02");
        list.add("test03");
        list.add("test04");
        list.forEach(s -> System.out.println(s));
    }

    /**
     * 供给型，无参有返回
     *
     * 生成一个对象，可以作工厂
     */
    @Test
    public void testSupplier() {
        Supplier<List> supplier = () -> new ArrayList<>(3);
        System.out.println(supplier.get().size());
    }

    /**
     * 函数型
     * 计算字符串长度
     */
    @Test
    public void testFunction() {
        String ss = "asdfasfd";
        Function<String, Integer> countSize = s -> s.length();
        System.out.println(countSize.apply(ss));
    }


    /**
     * 断定型
     * 过滤数组中字符串长度>3的串
     */
    @Test
    public void testPredicate() {
        List<String> list = new ArrayList<>();
        list.add("3333");
        list.add("22");
        list.add("1");
        list.add("555555");
        List<String> collect = list.stream().filter(s -> s.length() > 3).collect(Collectors.toList());
        System.out.println(collect);

    }

    public static void main(String[] args) {
        //java.util.Comparator java自到的函数
        List<String> list = Arrays.asList("I", "love", "you", "too");
        Collections.sort(list, (s1, s2) -> { // 省略参数表的类型
            if (s1 == null)
                return -1;
            if (s2 == null)
                return 1;
            return s1.length() - s2.length();
        });
        System.out.println(list);


        //声明一个函数，可以直接使用这个函数 ，也可以在类里面写一个方法，直接调用
        ConsumerInterface<String> function = (s) -> {
            System.out.println(s);
        };

        function.accept("aa");
        function.accept("bb");
        function = (s) -> {
            if (s.length() == 1) {
                System.out.println(s);
            }
        };
        function.accept("a");
        function.accept("aa");

        //实现类似回调机制
        FunctionalInterfaceDemo demo = new FunctionalInterfaceDemo();
        demo.useFunctionAsParameter(function);

    }

    /**
     * @return void
     * @throws
     * @Title: useFunctionAsParameter
     * @Description: 使用一个函数作为参数，可以实现回调
     * @param: [f]
     * @author away
     * @date 2019/7/28 23:28
     */
    public void useFunctionAsParameter(ConsumerInterface<String> f) {
        String ss = "s";
        f.accept(ss);

    }

}
